# 定义应用的数据模型

# 练习参考：https://www.runoob.com/flask/flask-orm.html

from flask_sqlalchemy import SQLAlchemy

#app
from . import app
# DB 必须用app进行db初始化
db = SQLAlchemy(app)


# 初始化数据库：创建或连接db
def init_db():
    if app is None or db is None:
        return False
    # 使用 SQLAlchemy 提供的方法来创建数据库和表
    with app.app_context():
        db.create_all() # 创建所有在当前上下文中定义的模型对应的表

    return True

# 模型是数据库表的 Python 类，每个模型类代表数据库中的一张表。
# 所有模型类需要继承自 db.Model
class User(db.Model):
    # 可以理解为 对象user是一条记录， User是整个表

    # 定义表结构
    # db.Column定义模型的字段，指定字段的类型、是否为主键、是否唯一、是否可以为空等属性。
    id = db.Column('user_id', db.Integer, primary_key = True) # 整数主键会自动增加
    name = db.Column(db.String(50), unique=True, nullable=False)
    email = db.Column(db.String(200), nullable=False)

    def __init__(self, name, email) -> None:
        self.name = name
        self.email = email

    def __repr__(self) -> str:
        return '<User %r>' % self.name

    @staticmethod
    def add(name, email):
        user = User(name, email)
        db.session.add(user)
        db.session.commit()

    @staticmethod
    def get_all():
        users = User.query.all()
        return users
    
    @staticmethod
    def update(user_id, name, email=''):
        user = User.query.get(user_id)
        flag = False
        if user and name :
            user.name = name
            flag = True
        if user and email:
            user.email = email
            flag = True
        
        if flag:
            db.session.commit()

    @staticmethod
    def remove(user_id):
        user = User.query.get(user_id)
        if user:
            db.session.delete(user)
            db.session.commit()
